package tests;

import java.awt.Point;
import java.util.Iterator;

import aplicacion.modelo.Celda;
import aplicacion.modelo.CeldasVecinas;
import junit.framework.Assert;
import junit.framework.TestCase;

public class CeldasVecinasTest extends TestCase {
	private final static int MAXIMO=4;

	public void testAgregar(){
		Point posicion=new Point(0,0);
		Celda celda=new Celda(posicion);
		CeldasVecinas celdasVecinas=new CeldasVecinas();
		celdasVecinas.add(celda);
		Assert.assertEquals(celdasVecinas.size(), 1);
	}
	
	public void testVacia(){
		CeldasVecinas celdasVecinas=new CeldasVecinas();
		Assert.assertEquals(celdasVecinas.size(), 0);
	}
	
	public void testObtenerDeVacia(){
		CeldasVecinas celdasVecinas=new CeldasVecinas();
		try{
			celdasVecinas.get(0);
		}catch(Exception e){Assert.assertTrue(true);};
		Assert.assertEquals(0, celdasVecinas.size());
	}
	
	public void testObtenerCelda(){
		Point posicion=new Point(0,0);
		Celda celda=new Celda(posicion);
		CeldasVecinas celdasVecinas=new CeldasVecinas();
		celdasVecinas.add(celda);
		Assert.assertEquals(celda,celdasVecinas.get(0));
	}
	
	public void testContieneASiContieneLaCelda(){
		Point posicion=new Point(0,0);
		Celda celda=new Celda(posicion);
		CeldasVecinas celdasVecinas=new CeldasVecinas();
		celdasVecinas.add(celda);
		Assert.assertTrue(celdasVecinas.contieneA(celda));
	}
	
	public void testContieneASiNoContieneLaCelda(){
		Point posicion=new Point(0,0);
		Celda celda=new Celda(posicion);
		CeldasVecinas celdasVecinas=new CeldasVecinas();
		Assert.assertTrue(!celdasVecinas.contieneA(celda));
	}
	
	private void cargarCeldasVecinas(CeldasVecinas celdasVecinas){
		for(int i=0;i<MAXIMO;i++){
			Point posicion=new Point(i,0);
			Celda celda=new Celda(posicion);
			celdasVecinas.add(celda);
		}
	}
	
	public void testIteradorEstaVacia(){
		CeldasVecinas celdasVecinas=new CeldasVecinas();
		Iterator<Celda> iterador=celdasVecinas.iterator();
		Assert.assertTrue(!iterador.hasNext());		
	}
	
	public void testIteradorNoEstaVacia(){
		CeldasVecinas celdasVecinas=new CeldasVecinas();
		Iterator<Celda> iterador=celdasVecinas.iterator();
		cargarCeldasVecinas(celdasVecinas);
		Assert.assertTrue(iterador.hasNext());		
	}
	
	public void testIteradorObtener(){
		CeldasVecinas celdasVecinas=new CeldasVecinas();
		Iterator<Celda> iterador=celdasVecinas.iterator();
		cargarCeldasVecinas(celdasVecinas);
		for(int i=0;i<MAXIMO;i++){
			Assert.assertTrue(iterador.hasNext());	
			iterador.next();
		}
	}
	
	public void testIteradorObtenerUno(){
		CeldasVecinas celdasVecinas=new CeldasVecinas();
		Iterator<Celda> iterador=celdasVecinas.iterator();
		Celda celda=new Celda(new Point(0,0));
		celdasVecinas.add(celda);
		Assert.assertEquals(celda, iterador.next());
	}
	
	public void testIterador(){		
		int contador=0;
		Celda celda=new Celda(new Point(1,1));
		CeldasVecinas celdasVecinas=celda.obtenerCeldasVecinas();
		Iterator<Celda> iterador=celdasVecinas.iterator();
		while(iterador.hasNext()){
			contador++;
			iterador.next();	
		}
		Assert.assertTrue(celdasVecinas.size()==contador);
	}
	
	public void testIteradorr(){
		CeldasVecinas celdasVecinas=new CeldasVecinas();
		for(int i=0;i<MAXIMO;i++){
			celdasVecinas.add(new Celda(new Point(1,i)));
		}
		Assert.assertTrue(MAXIMO==celdasVecinas.size());
		Iterator<Celda> iterador=celdasVecinas.iterator();
		for(int i=0;iterador.hasNext();i++){
			Assert.assertTrue(iterador.next().compararCon(new Celda(new Point(1,i))));	
		}
	}	
}
